home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / tcpr-1.1.5 / tcprpmd.pl < prev    next >
Encoding:
Text File  |  1993-04-22  |  3.2 KB  |  174 lines

  1. #
  2. # File:        tcprpmd.pl
  3. # Author:    G. Paul Ziemba
  4. # Date:        92.01.24
  5. # SCCS:        @(#)tcprpmd.pl    1.10 4/23/93
  6. # Purpose:    listen for relay session requests; set up tcprelay and
  7. #        return port info to client. Called from inetd.
  8. #
  9.  
  10. #########################
  11. # Begin  Configuration    #
  12. #########################
  13.  
  14. $RelayProg = $EXEC_PATH . "/tcprelay";
  15. $VersionString = "1.10";
  16.  
  17. #########################
  18. # End Configuration    #
  19. #########################
  20.  
  21. $myname = $0;
  22. $myname =~ s:^.*/::;
  23. if (($ARGV[0] eq "-d") || ($myname eq "tcprpmd-d")) {
  24.     $debug = 1;
  25. }
  26.  
  27. $R_OK = "250 OK\n";
  28.  
  29. $| = 1;        # see if this is really necessary
  30.  
  31. chop($MyHostname = `hostname`);
  32. unless (do 'sys/socket.ph') {
  33.     eval 'sub SOCK_STREAM {1;} sub AF_INET {2;} sub PF_INET {2;}';
  34. }
  35.  
  36. #
  37. # Find out who conected to us
  38. #
  39. ($family, $port, $client_ip) = unpack('S n a4 x8', getpeername(STDIN));
  40. $client_name = gethostbyaddr($client_ip, &AF_INET);
  41.  
  42. #
  43. # if name lookup failed, then just use dotted quad
  44. #
  45. if ($client_name eq "") {
  46.     $client_name = join('.', unpack('C4', $client_ip));
  47. }
  48.  
  49. #
  50. # Ready for action
  51. #
  52. print "220 $MyHostname tcpr-portmapper version $VersionString ready ".
  53.     "client=[$client_name]\n";
  54.  
  55. #
  56. # command interpreter
  57. #
  58. while (<STDIN>) {
  59.     chop;
  60.     ($_, $arg, $rest) = split(/\s+/);
  61.     tr/A-Z/a-z/;
  62.     if (/^server$/) {
  63.         if (&badarg($arg)) {
  64.             print "550 Invalid argument\n";
  65.             next;
  66.         }
  67.         $Server = $arg;
  68.         print "230-server[$Server]\n";
  69.         print $R_OK;
  70.     } elsif (/^mode$/) {
  71.         if (&badarg($arg) || ($arg ne "ftp")) {
  72.             print "550 Invalid argument\n";
  73.             next;
  74.         }
  75.         $Mode = "-ftp";
  76.         print "230-mode[$arg]\n";
  77.         print $R_OK;
  78.     } elsif (/^service$/) {
  79.         if (&badarg($arg)) {
  80.             print "550 Invalid argument\n";
  81.             next;
  82.         }
  83.         $Service = $arg;
  84.         print "230-service[$Service]\n";
  85.         print $R_OK;
  86.     } elsif (/^nop$/) {
  87.         print $R_OK;
  88.     } elsif (/^relay$/) {
  89.         if (!defined($Server) || !defined($Service)) {
  90.             print "503 Bad Command Sequence\n";
  91.         }
  92.         &relay($Server, $Service);
  93.     } elsif (/^quit$/) {
  94.         print "221 Closing connection\n";
  95.         exit 0;
  96.     } else {
  97.         print "500 Syntax error\n";
  98.     }
  99. }
  100. exit 1;
  101.  
  102. #
  103. # verify server and service syntax
  104. #
  105. sub badarg {
  106.     local($_) = $_[0];
  107.  
  108.     s/\s//g;
  109.     if ($_ eq "") {
  110.         return 1;
  111.     }
  112.     if (/[\!\@\#\$\%\^\&\*\(\)\{\}\[\]\:\;\"\'\~\`\<\>\,\?\/]/) {
  113.         return 1;
  114.     }
  115.     return 0;
  116. }
  117.  
  118. #
  119. # Call the relay program, capture the port number, and return it to client
  120. #
  121. sub relay {
  122.     local($Server, $Service) = @_[0,1];
  123.     local(@elist) = ($Server, $client_name, $Service);
  124.  
  125.     # avoid metacharacter cracker holes
  126.     if (!open(RELAY, "-|")) {
  127.         open(STDERR, ">&STDOUT");
  128.         if ($debug) {
  129.             unshift(@elist, "-d");
  130.         }
  131.         if (defined($Mode)) {
  132.             unshift(@elist, $Mode);
  133.         }
  134.         exec $RelayProg, @elist;
  135.         print "551 exec($RelayProg) failed: $!\n";
  136.         exit 1;
  137.     }
  138.  
  139.     while (<RELAY>) {
  140.         #
  141.         # lines from tcprelay starting with 9\d\d are error
  142.         # messages to be forwarded to client
  143.         #
  144.         if (/^9\d\d\s+(\S.*)$/) {
  145.             push(@errlist, $1);
  146.         } else {
  147.             push(@remarklist, $_);
  148.         }
  149.         next if (!/port=/);
  150.  
  151.         #
  152.         # Success
  153.         #
  154.         s/^.*port=//;
  155.         s/(\d+)\D+/\1/;
  156.         print "212 PORT $_\n";
  157.         ++$gotport;
  158.     }
  159.     close (RELAY);
  160.  
  161.     if ($gotport) {
  162.         exit 0;
  163.     }
  164.     foreach (@remarklist) {
  165.         print "230-$_";
  166.     }
  167.     foreach (@errlist) {
  168.         print "550-$_";
  169.     }
  170.     print "550 relay failed\n";
  171.  
  172.     exit 1;
  173. }
  174.